package com.hzh.controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hzh.entity.FileEntity;
import com.hzh.entity.OperationResult;
import com.hzh.entity.PageBean;
import com.hzh.entity.UserEntity;
import com.hzh.service.FileService;
import com.hzh.service.UserService;
import com.hzh.util.ExceptionUtil;
import com.hzh.util.HgMultipartFile;
import com.hzh.util.RequestUtil;
import com.hzh.util.ResponseUtil;

/**
 * ClassName: FileController <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON(可选). <br/>
 * date: 2017年4月28日 下午2:17:58 <br/>
 *
 * @author xiaohua
 * @version 
 * @since V1.0.0
 */
@Controller
@RequestMapping("/view")
public class FileController {
    //此注解表示以byname(fileService)方式注入bean
    @Autowired
    private FileService fileService;    //文件service接口
    @Autowired
    private UserService userService;    //用户service接口
    
    @RequestMapping("/view/{userId}")   //请求路径的注解
    public String showFile(@PathVariable String userId,Model model){
    	UserEntity user = userService.getByUserId(userId);
    	if(user==null){
    		return "errorPage";   //用户不存在（登陆失败）跳转到错误页面
    	}
    	model.addAttribute("userName", user.getUserName());    //绑定用户名到前台页面，用以显示用户名称
    	model.addAttribute("userRole", user.getUserRole());    //绑定用户角色到前台页面，通过角色来控制页面部分组件的隐藏
        return "file";      //登录成功跳转到file.jsp页面；
    }
    
    @RequestMapping("/create")
    public void create(FileEntity fileEntity,HttpServletRequest request, HttpServletResponse response) throws Exception{
    	//使用UUID为数据表创建唯一ID
        UUID uuid = UUID.randomUUID();
        //调用UUID的toString()方法将其转换成String类型，并去掉“-”
        String fileId = uuid.toString().replace("-", "");
    	//获取页面参数
        Map<String, String> vo = RequestUtil.getRequestParamMap(request);
        //上传成功回传到前台的数据
        String result="success";
        try {
            //获取到上传的数据
        	ArrayList<HgMultipartFile>  multipartList = RequestUtil.getMultipartFileList(request);
        	//获取上传文件名并设置到FileEntity实体中
        	fileEntity.setFileName(fileId+multipartList.get(0).getOriginalFilename());
        	//设置文件ID
        	fileEntity.setFileId(fileId);
        	//设置逻辑删除属性（为1时已删除）
            fileEntity.setIsDelete("0");
            //设置下载次数
            fileEntity.setDownloadCount(0);
            //设置上传时间
            fileEntity.setUploadTime(new Date());
            //设置文件保存路径
            String fileSavePath = "D:\\temp";
            fileEntity.setFilePath(fileSavePath);
            System.err.println(fileSavePath);
            //将文件信息保存到数据库中
            fileService.create(fileEntity);
            //将文件保存到设置的路径中
        	fileService.saveSingleFileUpload(vo, multipartList,fileEntity.getFilePath()+"\\"+fileEntity.getFileName());
        } catch (Exception e) {
        	e.printStackTrace();
        	//上传失败回传到前台的数据
            result = ExceptionUtil.getExceptionMsg(e);
        }
        //向前台响应数据
        ResponseUtil.renderHtml(response, result);
    }
    
    @RequestMapping("/delete")
    @ResponseBody   //向响应体中添加数据并响应到前台
    public OperationResult delete(FileEntity fileEntity,String fileIds) throws Exception{
        //用于保存响应数据的实体
    	OperationResult result = new OperationResult();
    	//设置逻辑假删除
    	fileEntity.setIsDelete("1");
    	try {
    	    //判断是批量删除或者是单个删除；
    		if(fileIds==""||fileIds==null){
    		    //单个删除
    			fileService.update(fileEntity);
	    	}else{
	    	    //批量删除
		    	String[] ids = fileIds.split(",");
		        for(String fileId : ids){
		        	fileEntity.setFileId(fileId);
		        	fileService.update(fileEntity);
		        }
	        }
    		//删除成功返回的数据
	        result.setSuccess(true);
	    }catch (Exception e) {
	            e.printStackTrace();
	            //删除失败返回的数据
	            result.setSuccess(false);
	            result.setErrorMsg("资源不存在！");
	    }
	    return result;
    }
    
    @RequestMapping("/list")
    @ResponseBody
    public JSONObject list(String page,String rows,String startTime,String endTime,FileEntity fileEntity) throws Exception{
    	//查询未删除的记录
    	fileEntity.setIsDelete("0");
    	//分页实体类，用于获取开始位置和每页记录数
    	PageBean pageBean = new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
    	Map<String,Object> map = new HashMap<String,Object>();
    	//将查询条件设置到Map里面，方便sqlmap接收
    	map.put("startTime", startTime);   //设置查询开始时间
    	map.put("endTime", endTime);   //设置查询结束时间
    	map.put("isDelete", fileEntity.getIsDelete());     //查询未删除的记录
        map.put("fileName", fileEntity.getFileName());     //设置查询文件名
        map.put("fileDescription", fileEntity.getFileDescription());     //设置查询文件描述
        map.put("uploadTeacher", fileEntity.getUploadTeacher());    //设置查询上传者
        map.put("start", pageBean.getStart());  //查询记录每页开始索引
        map.put("pageSize", pageBean.getPageSize());    //每页记录数
        //获得查询的一页的记录
        List<FileEntity> list = fileService.getList(map);
        for(FileEntity fileModel:list){
            //截取文件名（因为文件名是UUID+上传文件名拼接成的，在前台显示时截取出上传时的文件名，方便阅读）
        	fileModel.setFileName(fileModel.getFileName().substring(32));
        }
        //获取总记录数
        int total = fileService.getTotal(map);
        //创建JSON对象用以获取JSON数组
        JSONObject result = new JSONObject();
        //获取JSON数组用以存放数据
        JSONArray jsonArray = (JSONArray)JSON.toJSON(list);
        //每页的数据
        result.put("rows", jsonArray);
        //总记录数
        result.put("total", total);
        //将数据返回到前台页面
		return result;
    }
    @RequestMapping("/downloadFile/{fileId}")
    public void downloadFile(FileEntity fileEntity,@PathVariable String fileId,HttpServletResponse response) {
        
        //创建文件输出流
    	OutputStream os = null;
    	//创建文件输入流
        InputStream fis = null;
        //获取要下载的文件的信息
    	fileEntity = fileService.getByFileId(fileId);
    	
    	try {
    	    //创建File对象用以获取输出流
            File file = new File(fileEntity.getFilePath()+"\\"+fileEntity.getFileName());
            //重置响应对象
            response.reset();
            //设置响应头信息
            response.addHeader("Content-Disposition",
                "attachment;filename=" + URLEncoder.encode(fileEntity.getFileName().substring(32), "UTF-8"));
            //获取输出流
            os = response.getOutputStream();
            //获取缓存输入流，提高系统下载效率
            fis = new BufferedInputStream(new FileInputStream(file));
            //设置缓存大小
            byte[] buffer = new byte[2048];
            while (fis.read(buffer) > 0) {
                //输出字节流
                os.write(buffer);
            }
            //下载完成设置下载次数加一
            fileEntity.setDownloadCount(fileEntity.getDownloadCount()+1);
            //保存下载次数到数据库中
            fileService.update(fileEntity);
        } catch (Exception e) {
            e.printStackTrace();
            //输出错误信息到页面
            ResponseUtil.renderText(response, ExceptionUtil.getExceptionMsg(e));
        //关闭输入输出流
        } finally {
            try {
                if (fis != null) {
                        fis.close();
                }
                if (os != null) {
                    os.flush();
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}